package main

import (
	"fmt"
	"strconv"
	// "strings"
	// "unsafe"
)

var g = "xxx2"

// gl := 2

func getUserInfo() (string, int) {
	return "lll", 10
}

func main() {

	// // fmt.Print("你好 golang")
	// // fmt.Println("你好 golang")
	// // fmt.Printf("你好 golang")

	// // fmt.Print("a")
	// // fmt.Print("b")

	// // var a = "bb"
	// // fmt.Printf("%v", a)
	// // fmt.Println(a)

	// //声明的变量必须使用，否则报错

	// a := 10
	// fmt.Println(a)

	// var b int = 20
	// fmt.Printf("a=%v  b=%v\n", a, b)
	// // println 多个变量之间会带有空格
	// fmt.Println("a=", a, "b=", b)

	// fmt.Printf("a=%v, type=%T\n", a, a)

	// var age int
	// var name string
	// fmt.Println(age)
	// fmt.Println(name)

	// var a1, a2, a3 string
	// a1 = "a1"
	// a2 = "a2"
	// a3 = "a3"
	// fmt.Println(a1, a2, a3)

	// var (
	// 	b1 string
	// 	b2 int
	// )
	// b1 = "xxx"
	// b2 = 10
	// fmt.Println(b1, b2)

	// var (
	// 	username = "zz"
	// 	age2     = 10
	// )
	// fmt.Println(username, age2)

	// //短变量声明法，只能声明局部变量，不能声明全局变量
	// weight := 100
	// fmt.Println(weight)

	// c, d, e := 11, 12, "C"
	// fmt.Println(c, d, e)

	// fmt.Println(g)
	// // fmt.Println(gl)

	// var username2, age3 = getUserInfo()
	// fmt.Println(username2, age3)

	// //匿名变量
	// var username3, _ = getUserInfo()
	// fmt.Println(username3)

	// //常量定义了可以不使用
	// const cc = "123"
	// const (
	// 	ww = 1
	// 	ee // 1
	// 	dd // 1
	// )
	// const (
	// 	ff  = iota //自增, 0
	// 	ff1        //1
	// 	ff2        //2
	// 	ff3 = 100
	// 	ff4 = iota // 4
	// 	ff5        // 5
	// )
	// fmt.Println(ww, ee, dd)
	// fmt.Println(ff, ff1, ff2, ff3, ff4, ff5)

	// const (
	// 	n1, n2 = iota + 1, iota + 2 // 1, 2
	// 	n3, n4                      //2, 3
	// 	n5, n6                      //3, 4
	// )
	// fmt.Println(n1, n2)
	// fmt.Println(n3, n4)
	// fmt.Println(n5, n6)

	// var mycount int8 = 10 //1字节,8位，1位是符号，2^7
	// fmt.Printf("mycount=%v, type=%T\n", mycount, mycount)

	// var mycount2 int16 = 128 //2字节，16位，1位是符号，2^15
	// fmt.Println(unsafe.Sizeof(mycount), unsafe.Sizeof(mycount2))
	// fmt.Println(int8(mycount2)) //类型转换，超出范围

	// mynum := 12
	// fmt.Printf("mynum=%v\n", mynum) //原样输出
	// fmt.Printf("mynum=%d\n", mynum) //10进制
	// fmt.Printf("mynum=%b\n", mynum) //二进制
	// fmt.Printf("mynum=%o\n", mynum) //八进制
	// fmt.Printf("mynum=%x\n", mynum) //十六进制

	// var a float32 = 3.14
	// var b float64 = 2.14474456
	// //%f默认保留小数点后6位
	// fmt.Printf("a=%v, a=%f\n", a, a)
	// fmt.Printf("b=%v, b=%f\n", b, b)

	// //布尔类型只有true、false，其他类型无法转换成布尔类型
	// var flag = true
	// if flag {
	// 	fmt.Println("true")
	// }
	// // var num = 1
	// // if num {//会报错
	// // 	fmt.Println("xds")
	// // }

	// bb := `
	// sssss
	// dddd
	// fgggg
	// `
	// fmt.Println(bb)

	// cc := "dddd" +
	// 	"ffff" +
	// 	"gggg"
	// fmt.Println(cc)

	// str1 := "xxx"
	// str2 := "333"
	// str3 := str1 + str2
	// fmt.Println(str3)

	// fmt.Println(len(str3))

	// str4 := fmt.Sprintf("%v-%v", str1, str2)
	// fmt.Println(str4)

	// //切片
	// str5 := "aaa-bbb"
	// arr := strings.Split(str5, "-")
	// fmt.Println(arr) //切片，简单理解为数组，实际上切片和数组有区别

	// //拼接
	// str6 := strings.Join(arr, "*")
	// fmt.Println(str6)

	// //定义切片
	// arr2 := []string{"php", "python", "golang"}
	// fmt.Println(arr2)
	// // print(arr2)

	// //包含
	// // stra := "this is a"
	// // strb := "this"
	// // num := strings.Contains(stra, strb)
	// // fmt.Println(num)
	// // print(num)

	// //查找子串的位置，没找到返回0
	// // stra := "this is a"
	// // strb := "is"
	// // num := strings.Index(stra, strb)
	// // fmt.Println(num)
	// // print(num)

	// //是否为前缀，是true，否false
	// // stra := "this is a"
	// // strb := "this"
	// // num := strings.HasPrefix(stra, strb)
	// // fmt.Println(num)
	// // print(num)

	// //字符，%v 输出的是ASCII, %c 才是原样输出
	// // var g = 'g'
	// // fmt.Println(g)
	// // fmt.Printf("%v %c %T", g, g, g)

	// //循环
	// ss := "abcd你好"
	// for i := 0; i < len(ss); i++ {
	// 	fmt.Printf("%v %c\n", ss[i], ss[i])
	// }

	// fmt.Println()
	// //处理中文，用range（rune）
	// for _, value := range ss {
	// 	fmt.Printf("%v %c\n", value, value)
	// }

	// //修改字符串
	// byteStr := []byte(ss)
	// // byteStr[4] = 'p'//修改中文会有问题，因为中文是3个字符
	// byteStr[0] = 'p'
	// fmt.Println(string(byteStr))

	// //修改中文，使用rune
	// runeStr := []rune(ss)
	// runeStr[4] = 'p'
	// fmt.Println(string(runeStr))

	//类型转换
	//string --》 int
	// str1 := "1234"
	// num, _ := strconv.ParseInt(str1, 10, 64)
	// fmt.Printf("%v ---%T", num+2, num)

	//其他类型 ---> string
	var a int = 10
	str1 := strconv.FormatInt(int64(a), 10)
	str2 := fmt.Sprintf("%d", a)
	fmt.Printf("%v----%T\n", str1, str1)
	fmt.Printf("%v----%T\n", str2, str2)

	fmt.Println()
	var b float64 = 10.234
	//'f': 格式化模式  2: 对两位小数格式化  64: 格式化的float类型
	str3 := strconv.FormatFloat(b, 'f', 2, 64)
	str4 := fmt.Sprintf("%f", b)
	fmt.Printf("%v----%T\n", str3, str3)
	fmt.Printf("%v----%T\n", str4, str4)

	fmt.Println()
	//字符，单引号
	d := 'd'
	fmt.Printf("%v-----%T\n", d, d)
	str5 := fmt.Sprintf("%c", d)
	fmt.Printf("%v-----%T\n", str5, str5)

	f := true
	str6 := fmt.Sprintf("%t", f)
	fmt.Printf("%v-----%T\n", str6, str6)

}
